GPIO 配置之ODR, BSRR, BRR 详解 您所在的位置:网站首页 xiaomi brr GPIO 配置之ODR, BSRR, BRR 详解

GPIO 配置之ODR, BSRR, BRR 详解

2023-08-11 14:14| 来源: 网络整理| 查看: 265

STM32 GPIO 配置之ODR, BSRR, BRR 详解

用stm32 的配置GPIO 来控制LED 显示状态,可用ODR,BSRR,BRR 直接来控制引脚输出状态.

ODR寄存器可读可写:既能控制管脚为高电平,也能控制管脚为低电平。

管脚对于位写1 gpio 管脚为高电平,写 0 为低电平

BSRR 只写寄存器:[color=Red]既能控制管脚为高电平,也能控制管脚为低电平。对寄存器高 16bit 写1 对应管脚为低电平,对寄存器低16bit写1对应管脚为高电平。写 0 ,无动作

BRR 只写寄存器:只能改变管脚状态为低电平,对寄存器 管脚对于位写 1 相应管脚会为低电平。写 0 无动作。

BRR、BSRR、ODR都是用来控制16位针脚的。

其中,BRR和ODR高16位都不可用(Reserved),使用低16位控制针脚,而BSRR高16位和低16位皆可用,都用来控制16位针脚。

关于写0无效的意义:

举个例子,GPIOx->BRR=0x01与GPIOx->BSRR=0x01ODR=0x01后变为0000000000000001。

---------------------  作者:alanzjl  来源:CSDN  原文:https://blog.csdn.net/alanzjl/article/details/43857963  版权声明:本文为博主原创文章,转载请附上博文链接!

但是BSRR高16bit怎么设置高电平呢……写0没用啊……我会继续找确切的答案,如果有大佬知道的话麻烦留言帮助一下,谢谢。

刚开始或许你跟我一样有以下疑惑:

1.既然ODR 能控制管脚高低电平为什么还需要BSRR和SRR(BRR?)寄存器? 2.既然BSRR能实现BRR的全部功能,为什么还需要SRR(BRR?)寄存器? 对于问题 1 ------ 意法半导体给的答案是---

“This way, there is no risk that an IRQ occurs between the read and the modify access.” 什么意思呢?就就是你用BSRR和BRR去改变管脚状态的时候,没有被中断打断的风险。也就不需要关闭中断。

用ODR操作GPIO的伪代码如下:

disable_irq() save_gpio_pin_sate = read_gpio_pin_state(); save_gpio_pin_sate = xxxx; chang_gpio_pin_state(save_gpio_pin_sate); enable_irq();

关闭中断明显会延迟或丢失一事件的捕获,所以控制GPIO的状态最好还是用SBRR和BRR

对于问题 2 ------- 个人经验判断意法半导体仅仅是为了程序员操作方便估计做么做的。

因为BSRR的 低 16bsts 恰好是set操作,而高16bit是 reset 操作 而BRR 低 16bits 是reset 操作。

简单地说GPIOx_BSRR的高16位称作清除寄存器,而GPIOx_BSRR的低16位称作设置寄存器。

另一个寄存器GPIOx_BRR只有低16位有效,与GPIOx_BSRR的高16位具有相同功能。

举个例子说明如何使用这两个寄存器和所体现的优势。

例如GPIOE的16个IO都被设置成输出,而每次操作仅需要

改变低8位的数据而保持高8位不变,假设新的8位数据在变量Newdata中,

这个要求可以通过操作这两个寄存器实现,STM32的固件库中有两个函数

GPIO_SetBits()和GPIO_ResetBits()使用了这两个寄存器操作端口。 上述要求可以这样实现: GPIO_SetBits(GPIOE, Newdata & 0xff); GPIO_ResetBits(GPIOE, (~Newdata & 0xff)); 也可以直接操作这两个寄存器: GPIOE->BSRR = Newdata & 0xff; GPIOE->BRR = ~Newdata & 0xff; 当然还可以一次完成对8位的操作: GPIOE->BSRR = (Newdata & 0xff) | ( (~Newdata & 0xff)BRR = 0x40;

BSRR还有一个特点,就是Set比Reset的级别高,

就是说同一个bit又做Set又做Reset,最后结果是Set

要同步变化只要简单的 GPIOx->BSRR = 0xFFFF0000 | PATTEN;

即可,不用考虑哪些需要置1,哪些需要清零

从最后这个操作可以看出使用BSRR寄存器,可以实现8个端口位的同时修改操作。

http://www.cnblogs.com/shangdawei/p/4723941.html



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

      专题文章
        CopyRight 2018-2019 实验室设备网 版权所有